﻿#define _CRT_SECURE_NO_WARNINGS 1

//定义矩阵A n, m, B m, p, C n ，p ，计算A* B的结果，并存放到C中。(网络搜索关于矩阵乘法的定义）
//C[i][j] = ∑_k = 0 ^ m−1▒(A[i][k]∗B[k][j])

#include <stdio.h>
//VS2022不支持变长数组 这里改用宏定义
#define max_n 30
#define max_m 30
#define max_p 30

//先写一个矩阵乘法的函数
void multiplication(int n, int m,int p, int A[max_n][max_m],int B[max_m][max_p],int C[max_n][max_p])
{
	//主函数中输入AB 这里将C初始化
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < p; j++)
		{
			C[i][j] = 0;
		}
	}

	//进行矩阵乘法运算
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < p; j++)
		{
			//C[i][j]为C的一个元素，此时需要第i行的A与第j列的对应的B进行相乘
			for (int tmp = 0; tmp < m; tmp++)
			{
				C[i][j] += (A[i][tmp] * B[tmp][j]);
			}
		}
	}
}

//打印矩阵的函数
void Print(int m, int n, int arr[max_n][max_n])
{
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < n; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
}
int main()
{
	int n, m, p;
	/*定义好三个矩阵*/
	int A[max_n][max_m];
	int B[max_m][max_p];
	int C[max_n][max_p];
	Return:
		printf("请输入矩阵A的维度:\n");
		scanf("%d %d", &n, &m);
		int tmp = m;
		printf("请输入矩阵B的维度:\n");
		scanf("%d %d", &m, &p);
	if (tmp != m)
	{
		printf("输入错误，请重新输入\n");
		goto Return;
	}
	
	printf("请输入矩阵A:\n");
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			printf("当前输入A[%d][%d]:",i,j);
			scanf("%d", &A[i][j]);
		}
	}
	printf("请输入矩阵B:\n");
	for (int i = 0; i < m; i++)
	{
		for (int j = 0; j < p; j++)
		{
			printf("当前输入B[%d][%d]:", i, j);
			scanf("%d", &B[i][j]);
		}
	}

	//进行矩阵乘法运算
	multiplication(n, m,p, A, B, C);
	//打印矩阵观察结果
	printf("矩阵A:\n");
	Print(n, m, A);
	printf("矩阵B:\n");
	Print(m, p, B);
	printf("矩阵C:\n");
	Print(n, p, C);
	return 0;
}